﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Event_Delagete_Demo
{
    /// <summary>
    /// 事件的完整程序
    /// </summary>
    public class CatDelagete
    {
        /// <summary>
        /// 1、定义内部事件参数类型CatEventArgs， 用于存放 事件触发时 向事件处理程序 传递的状态信息
        /// </summary>
        public class CatEventArgs : EventArgs { }

        /// <summary>
        /// 2、申明事件委托
        /// </summary>
        /// <param name="sender">事件发送者对象</param>
        /// <param name="e">事件参数类对象</param>
        public delegate void CatDelageteHandler(object sender, CatEventArgs e);

        /// <summary>
        /// 2、定义事件成员
        /// </summary>
        public event CatDelageteHandler myCatCall;


        /// <summary>
        /// 4、定义 负责通知 事件触发 的方法(提供受保护虚方法), 目的是可以在子类中被覆写来拒绝监听
        /// </summary>
        /// <param name="e"></param>
        protected virtual void OnCatCall(CatEventArgs e)
        {
            if (myCatCall != null)
            {
                //若缺少此语句，将使得事件监听无法执行
                myCatCall(this, e);
            }
        }


        /// <summary>
        /// 5、定义事件触发方法，该方法执行一个动作；  例如调用该方法 就表示 有新的“猫叫”动作被执行
        /// </summary>
        public void CatCall()
        {
            CatEventArgs e = new CatEventArgs();
            Console.WriteLine("猫大叫一声！");
            //通知所有的事件的注册者，表示有一个新的“猫叫”动作被执行了
           OnCatCall(e);
        }

    }

    /// <summary>
    /// 定义事件触发程序，用来监听事件
    /// </summary>
    public class CatDelageteManager
    {
        /// <summary>
        /// 所有的老鼠都开始逃跑
        /// </summary>
        public void MouseEscape(object sender, CatDelagete.CatEventArgs e)
        {
            Console.WriteLine("所有的老鼠都开始逃跑！");
        }

        /// <summary>
        /// 主人被惊醒了
        /// </summary>
        public void MasterAwaken(object sender, CatDelagete.CatEventArgs e)
        {
            Console.WriteLine("主人被惊醒！");
        }
    }

}
